package tec;
/**
 * Réalisation d'une Jauge avec des entiers naturels.
 * <p>
 * Un objet Jauge définit un niveau et un intervalle ouvert ]vigieMin, vigieMax[. 
 * Le niveau d'une jauge n'est pas limité aux valeurs dans l'intervalle.
 * <p>
 * L'état d'une jauge correspond à la position de son niveau par rapport à 
 * l'intervalle ]vigieMin, vigieMax[.
 * Une jauge définit trois etats : 
 * <ul>
 * <li>vert niveau dans l'intervalle, 
 * <li>rouge niveau supérieur à l'intervalle,
 * <li>bleu niveau inférieur à l'intervalle.
 * </ul>
 * 
 * @author georgy
 * @since 2006-2007
 */

class TestJaugeNaturel { 


    TestJaugeNaturel(){

	lancer();
    }

    private void lancer(){
	
	
	System.out.print("Test de JaugeNaturel:");
	System.out.print(".");
	testDansIntervalle();

	System.out.print(".");
	testInferieurIntervalle();

	System.out.print(".");
	testSuperieurIntervalle();

	System.out.print(".");
	testDeplacement();

	System.out.print(".");
	testLimiteVigieMaxInferieurVigieMin();

	System.out.print(".");
	testMaxEgaleMin();
	
	System.out.println("OK");
    }

    

    private void  testDansIntervalle(){

	JaugeNaturel jaugeTest = new JaugeNaturel(-345,67899,100);
        jeVeuxFaux(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxVrai(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest.estBleu(), "jaugeTest.estBleu");
    }

    private void jeVeuxVrai (boolean expr, String m) {
            assert expr
                    : "\nECHEC jeVeuxVrai <" + m + ">";

    }

    private void jeVeuxFaux (boolean expr, String m) {
            assert !expr
                    : "\nECHEC jeVeuxFaux <" + m + ">";

    }

    private void testInferieurIntervalle(){
	JaugeNaturel jaugeTest = new JaugeNaturel(-345,67899,-400);
        jeVeuxFaux(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxVrai(jaugeTest.estBleu(), "jaugeTest.estBleu");

	JaugeNaturel jaugeTest2 = new JaugeNaturel(-345,67899,-345);
        jeVeuxFaux(jaugeTest2.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest2.estVert(), "jaugeTest.estVert");
        jeVeuxVrai(jaugeTest2.estBleu(), "jaugeTest.estBleu");
    }

    private void testSuperieurIntervalle(){
	JaugeNaturel jaugeTest = new JaugeNaturel(-345,67899,68000);
        jeVeuxVrai(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest.estBleu(), "jaugeTest.estBleu");

	JaugeNaturel jaugeTest2 = new JaugeNaturel(-345,67899,67899);
        jeVeuxVrai(jaugeTest2.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest2.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest2.estBleu(), "jaugeTest.estBleu");
    }

    private void testDeplacement(){
	JaugeNaturel jaugeTest = new JaugeNaturel(-345,67899,67898);
        jaugeTest.incrementer() ;
        jeVeuxVrai(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest.estBleu(), "jaugeTest.estBleu");

        jaugeTest.decrementer() ;
        jeVeuxFaux(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxVrai(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest.estBleu(), "jaugeTest.estBleu");
    }

    private void testLimiteVigieMaxInferieurVigieMin(){
	JaugeNaturel jaugeTest2 = new JaugeNaturel(67899,-345,0);
        jeVeuxVrai(jaugeTest2.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest2.estVert(), "jaugeTest.estVert");
        jeVeuxVrai(jaugeTest2.estBleu(), "jaugeTest.estBleu");
    }
    
    private void testMaxEgaleMin(){
	JaugeNaturel jaugeTest2 = new JaugeNaturel(100,100,200);
        jeVeuxVrai(jaugeTest2.estRouge(), "jaugeTest.estRouge");
        jeVeuxFaux(jaugeTest2.estVert(), "jaugeTest.estVert");
        jeVeuxFaux(jaugeTest2.estBleu(), "jaugeTest.estBleu");

	JaugeNaturel jaugeTest = new JaugeNaturel(100,100,100);
        jeVeuxVrai(jaugeTest.estRouge(), "jaugeTest.estRouge");
        jeVeuxVrai(jaugeTest.estVert(), "jaugeTest.estVert");
        jeVeuxVrai(jaugeTest.estBleu(), "jaugeTest.estBleu");
    }


            
}

    



class JaugeNaturel { 
  private int valeur;
  private final int MIN;
  private final int MAX;

 
    
 /**
   * Construit une instance en précisant la valeur de départ de la Jauge
   * et l'intervalle de vigie.
   * 
   * @param vigieMin valeur minimale de l'intervalle de vigie.
   * @param vigieMax valeur maximale de l'intervalle de vigie.
   * @param depart   valeur initiale de la jauge.
   */
  public JaugeNaturel(int vigieMin, int vigieMax, int depart) {
    valeur = depart;
    MIN = vigieMin;
    MAX = vigieMax;
    /* Le constructeur d'une classe permet d'initialiser l'etat de l'instance creee.
     * Son nom correspond toujours au nom de la classe. Il n'y a pas de type de retour.
     */
  }


  /**
   * L'état de la jauge est-il rouge ?
   *
   * @return vrai si niveau >=  vigieMax.
   *
   */
  public boolean estRouge() {
    return valeur >= MAX;
  }

  /**
   * L'état de la jauge est-il vert ?
   *
   * @return vrai si niveau appartient à ]vigieMin, vigieMax[.
   *
   */
  public boolean estVert() {
    return !estBleu() && !estRouge();
  }

  /**
   * L'état de la jauge est-il bleu ?
   *
   * @return vrai si niveau <= vigieMin.
   */
  public boolean estBleu() {
    return valeur <= MIN;
  }

  /**
   * Incrémente le niveau d'une unité.
   * L'état peut devenir supérieur à vigieMax.
   */
  public void incrementer() {
    valeur++;
  }

  /**
   * Décrémente le niveau d'une unité.
   * L'état peut devenir inférieur à la vigieMin.
   */
  public void decrementer() {
  }


  /**
   * Cette méthode est héritée de la classe {@link java.lang.Object}.
   * Très utile pour le débogage, elle permet de fournir une 
   * chaîne de caractères correspondant a l'état d'un objet.
   * <p> Un code par défaut est définit dans 
   * {@link java.lang.Object#toString() la classe Object} 
   * Il faut adapter (redéfinir) le code de cette méthode à chaque classe.
   *
   * Pour les chaînes de cararctères, l'opérateur + correspond a la concaténation. 
   * Les valeurs numériques sont alors convertit en ascii.
   * Si l'état d'une instance de cette classe est vigieMin=-456, vigieMax=23,
   * valeur=-7, la concaténation donne la chaîne "<-7 [-456,23]>".
   */
  @Override
  public String toString() {
    return "<" + valeur + " [" + MIN + "," + MAX + "]>"; 
  }
}
